home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 25 / Cream of the Crop 25.iso / bbs / doorinfo.zip / TCB.H < prev    next >
C/C++ Source or Header  |  1997-05-14  |  5KB  |  141 lines

  1. /*
  2. ** Task Control Block (TCB) structure, along with other related
  3. ** memory structures for the Adept Multi-Tasker
  4. **
  5. ** Copyright 1990 Herb Rose
  6. **
  7. */
  8.  
  9. #define maxtasks 80
  10. #define num_mcbs 256
  11. #define maxsem 128
  12. #define maxmsgq 160
  13.  
  14. #define map_a_task(x) ems_map_handle(tcb[x].handle)
  15.  
  16. struct tcb_rec
  17. {
  18.     int     next_tcb;   /* tcbs are arranged as a table, this is next index */
  19.     int     base_pri;   /* base priority */
  20.     int     cur_pri;    /* current priority */
  21.     int     pportnum;   /* port number (FOSSIL) used as stdio files  */
  22.     unsigned int     stackseg;
  23.     unsigned int     stackptr;
  24.     int     mcb_ptr;    /* first mcb */
  25.     int     tcbflags;   /* various state flags */
  26.     int     cur_state;  /* numerical value for task state */
  27.     int     sem_wait_num;
  28.     unsigned int mcbs_in_use;    /* doubles as the logical page count */
  29. /*
  30. ** Address of the last block of EMS memory allocated to this task,
  31. ** used by the 'resize block' directive.
  32. */
  33.     unsigned int last_ems_bl;
  34.     unsigned int expused;       /* expanded memory allocated by cswitch */
  35.     unsigned int expfree;       /* free expanded memory */
  36.     unsigned int dtaseg;    /* this guys disk transfer area - segment */
  37.     unsigned int dtaoff;    /* dta offset   */
  38.     unsigned int pspseg;    /* our psp segment */
  39.     int     load_status;    /* status of last 'loadtask' call */
  40.     int     handle;
  41.     int     parent;         /* tcb number of parent task */
  42.     void far *termfunc;     /* a function to call when task is terminated */
  43.     char    tcbname[14];
  44.     int  mem_strategy;
  45.     unsigned fpstat_off;
  46.     unsigned fpstat_seg;
  47.     unsigned fpvect_off;
  48.     unsigned fpvect_seg;
  49.     char unused[20];
  50. };
  51.  
  52. #define st_free    -1   /* this tcb not being used */
  53. #define st_active   0   /* the runner */
  54. #define st_ready    1   /* ready to run */
  55. #define st_sem_wait 2   /* waiting for a semaphore */
  56. #define st_delay    3   /* task is delaying */
  57. #define st_suspend  4   /* task is suspended - needs a wakeup signal */
  58. #define st_msg_wait 5   /* task is waiting for a message */
  59. #define st_stopping 6   /* task is terminating */
  60. #define st_swapout  7   /* task is currently swapped out */
  61. #define st_pipe_wait 8  /* task is waiting for something in the pipe */
  62. #define st_child_wait 9 /* waiting for a child task to complete */
  63.  
  64. /* the following are bit values for the flags word */
  65.  
  66. #define fl_no_swap  1   /* when this task is the runner, do not task swap */
  67. #define fl_in_dos   2   /* this task is in dos */
  68. #define fl_in_emm   4   /* this task executes in emm */
  69. #define fl_spawned  8   /* this task created with spawn */
  70. #define fl_pipe    16   /* this task uses pipes for stdin/stdout/stderr */
  71. #define fl_nofpu   32   /* program does not use FPU */
  72.  
  73. struct mem_ctrl_block {
  74.     int fwd_link;       /* index of next tcb */
  75.     unsigned int actlen;         /* actual length of data (for message queues) */
  76.     unsigned int m_size;         /* number of paragraphs */
  77.     unsigned int m_address;      /* the segment address */
  78.     };
  79.  
  80. struct msgq_rec {
  81.     int mmcb;    /* hoq and mcb for messages */
  82.     int mtcb;       /* same for tcbs */
  83.     };
  84.  
  85. struct pipe_rec
  86. {
  87.     int pmcb;
  88.     struct
  89.     {
  90.         int sendr;
  91.         int recvr;
  92.         int phead;
  93.         int ptail;
  94.         int pcount;
  95.         char *pbuf;
  96.     }   pipedir[2];
  97. };
  98.  
  99. /*
  100. ** Prototypes for CSWITCH function calls.
  101. */
  102.  
  103. void relinq( void );
  104. int sem_attach(int semnum);
  105. int sem_test(int semnum);
  106. int sem_release(int semnum);
  107. void delay(int numticks);
  108. void suspend( void );
  109. int spawn(void *addr, int pri);
  110. void wakeup(int tasknum);
  111. void setpri(int pri);
  112. int testmsg(int qnum);
  113. int send_md_msg(int qnum, void *buf, int len);
  114. int recvmsg(int qnum, void *buf, int len);
  115. int recvmsg_nowait(int qnum, void *buf, int len);
  116. void hog( void );
  117. void nohog( void );
  118. int loadtask(void *addr, int pri, int bgrd);
  119. void spawn_exit( void );
  120. int get_tcb_info(void *addr);
  121. int get_tcb_address(void *addr);
  122. int get_load_status( void );
  123. int send_pipe(int qnum, void *buf, int len);
  124. int recv_pipe(int qnum, void *buf, int len);
  125. int test_pipe(int pipenum);
  126. int loadpipe(void *addr, int pri, int bgrd);
  127. int execprog(void *addr, int pri, int bgrd);
  128. int ems_map_handle(int);
  129. void termtask(int);
  130. int ploadprg(char *name, int pri, int bgrdflag);
  131. int loadprg(char *name, int pri, int bgrdflag);
  132. int load_a_prog(char *name, int pri, int itcb, int bgrdflag);
  133.  
  134. /*
  135. ** ASM routines
  136. */
  137.  
  138. int _keyready(void);
  139. unsigned int _getakey(void);
  140.  
  141.